AWS ParallelCluster Slurmのジョブ実行履歴を保存するデータベース(Aurora Serverless v1)を構築、Slurmと連携させてみた
Slurm(ジョブスケジューラー)のジョブ実行状態の詳細と履歴を保存したいケースの対応方法です。 たとえば計算ノードに投げたジョブが成功した、失敗した、実行時間は何分だったというジョブの実行履歴を保存したいとしましょう。保存するにはMySQLか、MariaDBのRDBが必要です。これはAWS ParallelClusterの仕様ではなく、Slurmの仕様としてデータベースが必要になります。
クラウドHPCでAWSを利用しているのでデータベースはマネージドサービスを活用し運用負担を軽減したいです。今回はAWS ParallelClusterにマネージドサービスのAurora Serverless v1 MySQL互換を利用して、Slurmのジョブ実行履歴を保存できる環境を構築します。
Aurora Serverless
今回はRDBのマネージドサービスの中でも制限事項の多いAurora Serverless v1を採用します。
データベースの使用用途はSlurmのジョブ実行履歴を記録するだけです。WEBサーバのように24時間365日起動している必要もなく、演算中(ParallelClusterが稼働中)の間だけデータベースを起動していればことは足ります。
Aurora Serverless v1はデータベースへの接続がないと自動的に停止状態に設定できます。実行時間に対する従量課金を抑えることが容易です。Aurora Servelessの採用で気がかりな停止状態からの開始までに1分程度かかる点については、後述するslurmdbd
デーモンにより、ParallelCluster(ヘッドノード)起動中、Aurora Serverless v1は停止状態(OACU)にならない。ParallelClusterが起動中はAurora Serverless v1も起動状態(1ACU以上)を維持することが検証してわかりました。そのため、検証目的や24時間365日演算する環境でなければ安価にRDBのマネージドサービスを利用できます。
ユースケースによりますので以下の記事を参考に非ServerlessのAurora MySQLも評価対象に含めご検討ください。
検証環境
項目 | 値 |
---|---|
ParallelCluster | 2.10.4 |
Slurm(sinfo -V) | 20.02.7 |
OS | Ubuntu 18.04 LTS |
CPU | Intel |
HeadNode | t3.micro |
ComputeNode | c5.large |
MySQL | 5.7互換 |
設定手順
ヘッドノードの設定追加、変更が必要です。コンピュートノードに設定する項目はありません。データベースはMySQLかMariaDBが必要です。今回データベースはマネージドサービスのAurora Serverless v1を利用して環境構築します。
下記の設定を手順を参考にすすめます。
Slurmのアーキテクチャから見るとヘッドノードでslurmdbd
を有効化し、Database
はAurora Serverless v1で新規作成することになります。
Slurm Workload Manager - Quick Start User Guideより引用
Aurora Serverless v1の準備
Aurora Serverless v1でMySQLを作成する場合は下記を参考にしてください。RDS、AuroraでMySQLを作成する場合はAWS Compute Blogの手順を参考に作成してください。
Auroraのセキュリティグループのインバウンドにヘッドノードから接続を許可しましょう。
ParallelClusterヘッドノードの設定
MySQLクライアントをインストールします。
sudo apt update sudo apt search mysql-client sudo apt install mysql-client -y
ヘッドノードからMySQLの設定
DBのホスト名はご自身の環境に置き換えてください。
mysql -h database-1.cluster-cql5tgylta2m.us-east-1.rds.amazonaws.com -u admin -p
必要な権限を付与します。
mysql> GRANT ALL ON `%`.* TO admin@`%`;
MySQLの設定は以上です。設定という設定はないに等しい。
mysql> quit
ヘッドノードのSlurm設定ファイル編集
新規に設定ファイル作成します。
sudo vi /opt/slurm/etc/slurmdbd.conf
サンプルで下記のコンフィグを作成しました。DBのホスト名、ユーザ名、パスワード(ベタ書き)、ポート番号はご自身の環境に合わせて修正してください。Archive
シリーズでジョブ履歴関係の保持期限を設定できます。すべてのno
を指定し一定期間後に履歴を破棄しない設定にしました。
ArchiveEvents=no ArchiveJobs=no ArchiveResvs=no ArchiveSteps=no ArchiveSuspend=no ArchiveTXN=no ArchiveUsage=no AuthType=auth/munge DbdHost=localhost DbdPort=6819 DebugLevel=info SlurmUser=slurm LogFile=/var/log/slurmdbd.log PidFile=/var/run/slurmdbd.pid StorageType=accounting_storage/mysql StorageUser=admin # 環境に合わせて変更箇所 StoragePass=password # 環境に合わせて変更箇所 StorageHost=database-1.cluster-cql5tgylta2m.us-east-1.rds.amazonaws.com # 環境に合わせて変更箇所 StoragePort=3306 # 環境に合わせて変更箇所
次に既存の設定ファイルを編集します。
sudo vi /opt/slurm/etc/slurm.conf
末尾に以下の内容を追記します。
# ACCOUNTING JobAcctGatherType=jobacct_gather/linux JobAcctGatherFrequency=30 # AccountingStorageType=accounting_storage/slurmdbd AccountingStorageHost=localhost AccountingStorageUser=admin # 環境に合わせて変更箇所 AccountingStoragePort=6819 # 環境に合わせて変更箇所
参考元の手順では下記コマンドを実行してslurmdbd
を起動しています。動作確認したところslurmdbd
が起動しないとヘッドノードはデータベースと接続しません。つまり、ヘッドノード停止/開始のたびにこのコマンドを実行しないといけません。この問題はslurmdbd
をデーモン化して解決します。
# オリジナルの手順 sudo /opt/slurm/sbin/slurmdbd
slumdbdデーモンを新規作成します。
sudo vi /etc/systemd/system/slurmdbd.service
[Unit] Description=slurmdbd After=network.target [Service] Type=forking User=root ExecStart=/opt/slurm/sbin/slurmdbd Restart = always [Install] WantedBy=multi-user.target
slumdbdデーモンを自動起動設定します。
sudo systemctl daemon-reload sudo systemctl enable slurmdbd sudo systemctl start slurmdbd sudo systemctl status slurmdbd
slurmdbdがActiveで起動していれば成功です。オリジナルの手順にない作業は以上です。
● slurmdbd.service - slurmdbd Loaded: loaded (/etc/systemd/system/slurmdbd.service; enabled; vendor preset: enabled) Active: activating (auto-restart) since Thu 2021-06-03 05:33:42 UTC; 70ms ago Process: 21811 ExecStart=/opt/slurm/sbin/slurmdbd (code=exited, status=0/SUCCESS) Main PID: 21818 (code=exited, status=0/SUCCESS) Jun 03 05:33:42 ip-10-1-11-236 systemd[1]: Started slurmdbd.
最後にslurmctldデーモンを再起動します。
sudo systemctl restart slurmctld
ヘッドノードの設定は以上です。これでSlurmとAurora Serverlessが連携できるようになりました。
ジョブ実行履歴の確認
sacct
コマンドの結果からジョブの実行履歴を確認してみます。まずテストジョブを投げました。
$ sbatch -n1 test.sh
squeue
コマンドでジョブキューを確認します。StatusがCF(CONFIGURING)
になっており、コンピューティングリソースを使えるの待ち状態です。要は必要台数のコンピュートノード起動待ちです。
$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 5 spot1 test.sh ubuntu CF 0:33 1 spot1-dy-c5large-1
sacct
コマンドで確認するとRUNNING
表記です。
$ sacct JobID JobName Partition Account AllocCPUS State ExitCode ------------ ---------- ---------- ---------- ---------- ---------- -------- 5 test.sh spot1 1 RUNNING 0:0
squeue
で再度確認するとジョブは捌けたことがわかります。しかし、コンピュートノードでの処理は実行中なのか、正常に終わったのか、失敗だったのかはわからないですね。
$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
sacct
コマンドで実行結果を確認するとCOMPLETED
表記でExitCode 0
により、ジョブが正常終了していることがわかります。ExitCodeはO以外だと異常があったことを示します。
$ sacct JobID JobName Partition Account AllocCPUS State ExitCode ------------ ---------- ---------- ---------- ---------- ---------- -------- 5 test.sh spot1 1 COMPLETED 0:0 5.batch batch 1 COMPLETED 0:0
sacct
コマンドにオプションをつけるとジョブ開始時刻(Start)、終了時刻(End)、実行時間(Elapsed)も確認できます。ちなみにテストジョブはsleep 60
を実行するシェルスクリプトでした。実行時間は1分と記録されています。
$ sacct -o User,JobID,Partition,NNodes,Submit,Start,End,Elapsed,State -X User JobID Partition NNodes Submit Start End Elapsed State --------- ------------ ---------- -------- ------------------- ------------------- ------------------- ---------- ---------- ubuntu 5 spot1 1 2021-06-08T04:02:21 2021-06-08T04:04:54 2021-06-08T04:05:55 00:01:01 COMPLETED
Aurora ServerlessとSlurmを連携することでsacct
コマンドが利用でき、ジョブ履歴を保存できることが確認できました。
DBのテーブルを覗いてみる
sacct
の参照元DBを直接参照したらどうなのか気になったので試しました。ヘッドノードからデータベースへ接続します。slurm_acct_db
がsacct
で参照しているDBです。
折り畳み
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | slurm | | slurm_acct_db | | sys | +--------------------+ mysql> use slurm_acct_db; mysql> show tables; +-----------------------------------------+ | Tables_in_slurm_acct_db | +-----------------------------------------+ | acct_coord_table | | acct_table | | clus_res_table | | cluster_table | | convert_version_table | | federation_table | | parallelcluster_assoc_table | | parallelcluster_assoc_usage_day_table | | parallelcluster_assoc_usage_hour_table | | parallelcluster_assoc_usage_month_table | | parallelcluster_event_table | | parallelcluster_job_table | | parallelcluster_last_ran_table | | parallelcluster_resv_table | | parallelcluster_step_table | | parallelcluster_suspend_table | | parallelcluster_usage_day_table | | parallelcluster_usage_hour_table | | parallelcluster_usage_month_table | | parallelcluster_wckey_table | | parallelcluster_wckey_usage_day_table | | parallelcluster_wckey_usage_hour_table | | parallelcluster_wckey_usage_month_table | | qos_table | | res_table | | table_defs_table | | tres_table | | txn_table | | user_table | +-----------------------------------------+
ジョブ履歴が格納されていそうな名前のテーブルparallelcluster_job_table
を覗いてみます。sacct
コマンドにオプション付けて表示できた開始時刻などの値が格納されていました。
mysql> select * from parallelcluster_job_table; +------------+------------+---------+---------+---------------+----------------+-----------------+--------------------+-------------+----------+------------+------------+-----------+-------+------------+----------+--------------+---------------+----------+--------+--------+---------+----------+---------+----------+------------+----------------+-------------+-------------------+-----------+---------+--------------------+-------------+----------+-----------+------------+-------+------------+-------------+---------------+------------+------------+----------------+----------+------------+-----------+-------+--------------+----------------+-------------+------------------------------------+-------------+ | job_db_inx | mod_time | deleted | account | admin_comment | array_task_str | array_max_tasks | array_task_pending | constraints | cpus_req | derived_ec | derived_es | exit_code | flags | job_name | id_assoc | id_array_job | id_array_task | id_block | id_job | id_qos | id_resv | id_wckey | id_user | id_group | het_job_id | het_job_offset | kill_requid | state_reason_prev | mcs_label | mem_req | nodelist | nodes_alloc | node_inx | partition | priority | state | timelimit | time_submit | time_eligible | time_start | time_end | time_suspended | gres_req | gres_alloc | gres_used | wckey | work_dir | system_comment | track_steps | tres_alloc | tres_req | +------------+------------+---------+---------+---------------+----------------+-----------------+--------------------+-------------+----------+------------+------------+-----------+-------+------------+----------+--------------+---------------+----------+--------+--------+---------+----------+---------+----------+------------+----------------+-------------+-------------------+-----------+---------+--------------------+-------------+----------+-----------+------------+-------+------------+-------------+---------------+------------+------------+----------------+----------+------------+-----------+-------+--------------+----------------+-------------+------------------------------------+-------------+ | 1 | 1620979907 | 0 | NULL | NULL | NULL | 0 | 0 | NULL | 1 | 0 | NULL | 0 | 4 | test.sh | 0 | 0 | 4294967294 | NULL | 2 | 1 | 0 | 0 | 1000 | 1000 | 0 | 4294967294 | -1 | 0 | NULL | 0 | spot1-dy-c5large-1 | 1 | 0 | spot1 | 4294901759 | 3 | 4294967295 | 1620979720 | 1620979720 | 1620979846 | 1620979907 | 0 | | | | | /home/ubuntu | NULL | 0 | 1=1,3=18446744073709551614,4=1,5=1 | 1=1,4=1,5=1 | | 2 | 1620980171 | 0 | NULL | NULL | NULL | 0 | 0 | NULL | 2 | 0 | NULL | 0 | 4 | test.sh | 0 | 0 | 4294967294 | NULL | 3 | 1 | 0 | 0 | 1000 | 1000 | 0 | 4294967294 | -1 | 0 | NULL | 0 | spot1-dy-c5large-1 | 1 | 0 | spot1 | 4294901758 | 3 | 4294967295 | 1620980110 | 1620980110 | 1620980111 | 1620980171 | 0 | | | | | /home/ubuntu | NULL | 0 | 1=2,3=18446744073709551614,4=1,5=2 | 1=2,4=1,5=2 | | 3 | 1620984607 | 0 | NULL | NULL | NULL | 0 | 0 | NULL | 1 | 0 | NULL | 0 | 4 | test.sh | 0 | 0 | 4294967294 | NULL | 4 | 1 | 0 | 0 | 1000 | 1000 | 0 | 4294967294 | -1 | 0 | NULL | 0 | spot1-dy-c5large-1 | 1 | 0 | spot1 | 4294901759 | 3 | 4294967295 | 1620984086 | 1620984086 | 1620984221 | 1620984282 | 0 | | | | | /home/ubuntu | NULL | 0 | 1=1,3=18446744073709551614,4=1,5=1 | 1=1,4=1,5=1 | | 4 | 1620987272 | 0 | NULL | NULL | NULL | 0 | 0 | NULL | 1 | 0 | NULL | 0 | 8 | test.sh | 0 | 0 | 4294967294 | NULL | 5 | 1 | 0 | 0 | 1000 | 1000 | 0 | 4294967294 | -1 | 0 | NULL | 0 | spot1-dy-c5large-1 | 1 | 0 | spot1 | 4294901759 | 3 | 525600 | 1620987053 | 1620987053 | 1620987211 | 1620987272 | 0 | | | | | /home/ubuntu | NULL | 0 | 1=1,3=18446744073709551614,4=1,5=1 | 1=1,4=1,5=1 | | 5 | 1621991638 | 0 | NULL | NULL | NULL | 0 | 0 | NULL | 1 | 0 | NULL | 0 | 8 | test.sh | 0 | 0 | 4294967294 | NULL | 6 | 1 | 0 | 0 | 1000 | 1000 | 0 | 4294967294 | -1 | 0 | NULL | 0 | spot1-dy-c5large-1 | 1 | 0 | spot1 | 4294901759 | 3 | 525600 | 1621991435 | 1621991435 | 1621991578 | 1621991638 | 0 | | | | | /home/ubuntu | NULL | 0 | 1=1,3=18446744073709551614,4=1,5=1 | 1=1,4=1,5=1 | | 6 | 1622699299 | 0 | NULL | NULL | NULL | 0 | 0 | NULL | 1 | 0 | NULL | 0 | 4 | test.sh | 0 | 0 | 4294967294 | NULL | 2 | 1 | 0 | 0 | 1000 | 1000 | 0 | 4294967294 | -1 | 0 | NULL | 0 | spot1-dy-c5large-1 | 1 | 0 | spot1 | 4294901759 | 3 | 4294967295 | 1622699122 | 1622699122 | 1622699238 | 1622699299 | 0 | | | | | /home/ubuntu | NULL | 0 | 1=1,3=18446744073709551614,4=1,5=1 | 1=1,4=1,5=1 | | 7 | 1622708042 | 0 | NULL | NULL | NULL | 0 | 0 | NULL | 2 | 0 | NULL | 0 | 4 | test120.sh | 0 | 0 | 4294967294 | NULL | 3 | 1 | 0 | 0 | 1000 | 1000 | 0 | 4294967294 | -1 | 0 | NULL | 0 | spot1-dy-c5large-1 | 1 | 0 | spot1 | 4294901758 | 3 | 4294967295 | 1622699506 | 1622699506 | 1622699507 | 1622699627 | 0 | | | | | /home/ubuntu | NULL | 0 | 1=2,3=18446744073709551614,4=1,5=2 | 1=2,4=1,5=2 | | 8 | 1622766465 | 0 | NULL | NULL | NULL | 0 | 0 | NULL | 1 | 0 | NULL | 0 | 4 | test.sh | 0 | 0 | 4294967294 | NULL | 4 | 1 | 0 | 0 | 1000 | 1000 | 0 | 4294967294 | -1 | 0 | NULL | 0 | spot1-dy-c5large-1 | 1 | 0 | spot1 | 4294901759 | 3 | 4294967295 | 1622766234 | 1622766234 | 1622766404 | 1622766465 | 0 | | | | | /home/ubuntu | NULL | 0 | 1=1,3=18446744073709551614,4=1,5=1 | 1=1,4=1,5=1 | | 9 | 1623125155 | 0 | NULL | NULL | NULL | 0 | 0 | NULL | 1 | 0 | NULL | 0 | 8 | test.sh | 0 | 0 | 4294967294 | NULL | 5 | 1 | 0 | 0 | 1000 | 1000 | 0 | 4294967294 | -1 | 0 | NULL | 0 | spot1-dy-c5large-1 | 1 | 0 | spot1 | 4294901759 | 3 | 525600 | 1623124941 | 1623124941 | 1623125094 | 1623125155 | 0 | | | | | /home/ubuntu | NULL | 0 | 1=1,3=18446744073709551614,4=1,5=1 | 1=1,4=1,5=1 | +------------+------------+---------+---------+---------------+----------------+-----------------+--------------------+-------------+----------+------------+------------+-----------+-------+------------+----------+--------------+---------------+----------+--------+--------+---------+----------+---------+----------+------------+----------------+-------------+-------------------+-----------+---------+--------------------+-------------+----------+-----------+------------+-------+------------+-------------+---------------+------------+------------+----------------+----------+------------+-----------+-------+--------------+----------------+-------------+------------------------------------+-------------+
おわりに
Slurmのジョブ実行履歴を保存するにはデータベースが必要でした。そして、データベースにはAWSのマネージドサービスを活用できることを確認できました。Slurmのジョブ履歴を保存する必要がある、ジョブの実行結果を確認したいというときはRDS, Auroraの利用もご検討ください。